/**
 * 认证控制器 - 处理用户登录、注册、企业注册等认证相关REST API接口
 *
 * 开发人员：徐少洋
 * 开发时间：2025-10-20 至 2025-10-25
 * 模块职责：提供用户认证相关的REST API接口，支持登录、注册、企业注册等完整认证功能
 *
 * 技术要点：
 * - RESTful API设计，遵循REST规范
 * - JWT认证令牌生成和管理
 * - 多租户企业注册和管理员账户创建
 * - 密码加密和安全认证机制
 * - 用户权限和菜单权限集成
 *
 * 开发故事：负责认证控制器的开发，与认证服务层和前端登录界面深度配合，确保系统认证的安全性和可靠性。
 */
package com.pbl.controller;

import com.pbl.auth.AuthService;
import com.pbl.common.model.ApiResponse;
import com.pbl.dto.EnterpriseRegisterRequest;
import com.pbl.dto.LoginRequest;
import com.pbl.dto.RegisterRequest;
import com.pbl.entity.User;
import com.pbl.service.PermissionService;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/auth")
public class AuthController {

    private final AuthService authService;
    private final PermissionService permissionService;

    /**
     * 构造认证控制器
     * @param authService 认证服务层
     * @param permissionService 权限服务层
     */
    public AuthController(AuthService authService, PermissionService permissionService) {
        this.authService = authService;
        this.permissionService = permissionService;
    }

    @PostMapping("/login")
    public ApiResponse<Map<String, Object>> login(@Valid @RequestBody LoginRequest req) {
        Map<String, Object> loginResult = authService.login(req.getEnterpriseId(), req.getUsername(), req.getPassword());
        return ApiResponse.success(loginResult);
    }

    @PostMapping("/register")
    public ApiResponse<User> register(@Valid @RequestBody RegisterRequest req) {
        return ApiResponse.success(authService.register(req.getEnterpriseId(), req.getUsername(), req.getPassword(), req.getEmail()));
    }

    /**
     * 企业注册（创建企业+管理员账号）
     */
    @PostMapping("/register/enterprise")
    public ApiResponse<Map<String, Object>> registerEnterprise(@Valid @RequestBody EnterpriseRegisterRequest req) {
        Map<String, Object> result = authService.registerEnterprise(req);
        return ApiResponse.success(result);
    }
}
